--Singleton Pattern
--[[
	单例模式：（创建型）
	作用：获取唯一实例
	使用场景：工具类/服务类
--]]

Singleton = {}
Singleton.__index = Singleton
function Singleton:New(o)
	m = o or {}
	setmetatable(m,Singleton)
	return m
end
--获取单例实例
function Singleton:GetInstance()
	if not self.instance then
		self.instance = self:New()
	end
	return self.instance
end

--------Main--------
--GameMgr类继承自Singleton
GameMgr = Singleton:GetInstance()
GameMgr.name = 'GameMgr'
GameMgr.Init = function(self,onInitDoneCB)
	print(string.format('%s init done.',self.name))
	if onInitDoneCB then
		local info = '执行初始化后的回调'
		onInitDoneCB(info)
	end
end

function main()
	gameMgr1 = GameMgr:GetInstance()  --获取单例
	local cb = function(param)
		print(string.format('打印信息：%s',param))
	end
	gameMgr1:Init(cb)  --打印信息：执行初始化后的回调

	gameMgr2 = GameMgr:GetInstance()  --获取单例
	if gameMgr1 == gameMgr2 then  --两单例实例相同
		print('两单例实例相同')
	else
		print('两单例实例不同')
	end
	gameMgr1 = nil
	print('gameMgr1',gameMgr1)  --gameMgr1	nil
	print('gameMgr2',gameMgr2)  --gameMgr2	table: 00B39770
end

main()
